package algo_lignes_sites.data.path;

import algo_lignes_sites.data.junction.A_Junction;
import algo_lignes_sites.data.junction.JunctionDER;
import algo_lignes_sites.data.segment.SegmentDER;
import java.util.ArrayList;
import java.util.HashSet;


public class PathDER extends A_Path {

	protected ArrayList<JunctionDER> vJunctionDER;
	@Override
	public ArrayList getVJunction() {return vJunctionDER;}
	public ArrayList<JunctionDER> getVJunctionDER() {return vJunctionDER;}
	public void setVJunctionDER(ArrayList<JunctionDER> vJunctionDER) {this.vJunctionDER = vJunctionDER;}

	private ArrayList<SegmentDER> vSegmentDER;
	@Override
	public ArrayList getVSegment() {return vSegmentDER;}
	public ArrayList<SegmentDER> getVSegmentDER() {return vSegmentDER;}

	public JunctionDER from_der () {return vJunctionDER.get(0);}
	public JunctionDER to_der () {return vJunctionDER.get(vJunctionDER.size()-1);}

	private PathREF pathREF;

	public PathDER (PathREF pathREF) {
		super (pathREF.attributes, pathREF.zones, pathREF.contrainteGeom, pathREF.echelleGeneralization, pathREF.color);
		this.pathREF = pathREF;
		pathREF.pathDER = this;

		super.nbTotal_barbule = pathREF.nbTotal_barbule;
		super.nbIntersect_barbuleDroite = pathREF.nbIntersect_barbuleDroite;
		super.nbIntersect_barbuleGauche = pathREF.nbIntersect_barbuleGauche;

		this.setSuperPath (pathREF.getSuperPath());

		vJunctionDER = new ArrayList<JunctionDER>(pathREF.getVJunction().size());
	}
// TENTATIVE DE RESOLUTION DU CAS CIROL
//	public HashSet<JunctionDER> setNodeRepulsion = new HashSet<JunctionDER>();
	@Override
	String getInfoDetaille_specific() {
		String res="";
//
//		if (setNodeRepulsion.size()>0) {
//			res += "\nNode dont ce path va êter refoulé"
//			for (JunctionDER node : setNodeRepulsion)
//
//		}
//		res +=
		return res;
	}

	// Data_ls appelle une seule fois cette méthode
	@Override
	public void computeVSegment() {
		int nbJunction = vJunctionDER.size();

		vSegmentDER = new ArrayList<SegmentDER>(nbJunction-1);

		JunctionDER j1, j2;
		j2 = vJunctionDER.get(0);
		for (int i=0; i<nbJunction-1; i++) {
			j1 = j2;
			j2 = vJunctionDER.get(i+1);
			SegmentDER segDER = new SegmentDER(this, j1, j2);
			vSegmentDER.add(segDER);
			j1.addSegConnected(segDER);
			j2.addSegConnected(segDER);
		}
	}

/* OLD V19
	// A la fin des pre-traitement de données, cet appel prepare, dans chaque junction de chaque path
	//  des données permettant de savoir la direction "moyenne" du path au niveau de la junction
	// (utile pour les calcul d'angle entre path et détermination du coté ou l'on se trouve par
	//  rapport à une éventuelle dissymetrie du path)
	public void prepareDirectionData() {

		int nbJunction = vJunctionDER.size();
		if (nbJunction<=1) return;

		// la premiere et la derniere junction sont spéciales
		vJunctionDER.get(0).addDirectionData(this, vJunctionDER.get(0), vJunctionDER.get(1));
		vJunctionDER.get(nbJunction-1).addDirectionData(this, vJunctionDER.get(nbJunction-2), vJunctionDER.get(nbJunction-1));

		// init des variables de parcours
		JunctionDER jPrec = vJunctionDER.get(0);
		JunctionDER j = vJunctionDER.get(1);
		JunctionDER jSuiv;
		
		for (int i=1; i<nbJunction-1 ; i++) {
			 jSuiv = vJunctionDER.get(i+1);
			 j.addDirectionData(this, jPrec, jSuiv);

			 jPrec = j;
			 j = jSuiv;
		}
	}
*/

}
